iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
SideProject30

製作適用於網頁的台灣登山地圖系列 第 8

[Day8] OpenStreetMap 的資料格式

  • 分享至 

  • xImage
  •  

今天來介紹一下 OSM 中包含了哪些資料,大概五分鐘就可以說完。

簡單來講,OSM 中的地理資料只包含三個種類:

  1. node
  2. way
  3. relation

和大家直覺想到的「點」、「線」、「面」稍為有點不一樣,且聽我娓娓道來:

每個物件都有 id

首先,所有種類的物件,都使用流水編號來做為其 id。
舉例來說,資料庫中最新的 node id是 9999,那下一個被編輯者創造出來的 node id 就會是 10000。
不同種類的物件,其流水號是獨立的。

可以使用 OSM API 進行查詢

https://openstreetmap.org 允許使用者在網頁中顯示單一物件的資訊。

例如在 OSM 資料庫中,玉山山峰的種類是 node,其 id 是 3428095932,那麼就可以用以下的網址進行查詢:

https://openstreetmap.org/node/3428095932

mt jade

而如果要查詢該物件的原始資訊,則可以使用 OSM API 進行查詢。
要取得玉山這一物件的 XML 格式資料,可以用以下格式:

https://www.openstreetmap.org/api/0.6/node/3428095932

返回內容是由 <osm> 包裏的單一個 <node> 標籤,其內容為:

<node id="3428095932" visible="true" version="15" changeset="137705350" timestamp="2023-06-23T23:15:49Z" user="WWSS" uid="5062752" lat="23.4699871" lon="120.9572739">
 <tag k="alt_name:en" v="Jade Mountain;Mt. Morrison"/>
 <tag k="ele" v="3952"/>
 <tag k="isolation" v="1815"/>
 <tag k="name" v="玉山"/>
 <tag k="name:bnn" v="Tongku Saveq"/>
 <tag k="name:en" v="Yushan"/>
 <tag k="name:ja" v="玉山"/>
 <tag k="name:pwn" v="kanasi"/>
 <tag k="name:tsu" v="Patungkuonʉ"/>
 <tag k="name:xnb" v="Tanungu'incu"/>
 <tag k="name:zh" v="玉山"/>
 <tag k="natural" v="peak"/>
 <tag k="prominence" v="3952"/>
 <tag k="ref" v="百岳#1;五嶽-1"/>
 <tag k="source:prominence" v="Highest peak of Taiwan"/>
 <tag k="wikidata" v="Q500275"/>
 <tag k="wikipedia" v="zh:玉山"/>
</node>

而若是要取得 JSON 格式的資料,只要在 URL 後面加上 .json 即可:

https://www.openstreetmap.org/api/0.6/node/3428095932.json

結果為

{
  "type": "node",
  "id": 3428095932,
  "lat": 23.4699871,
  "lon": 120.9572739,
  "timestamp": "2023-06-23T23:15:49Z",
  "version": 15,
  "changeset": 137705350,
  "user": "WWSS",
  "uid": 5062752,
  "tags": {
    "alt_name:en": "Jade Mountain;Mt. Morrison",
    "ele": "3952",
    "isolation": "1815",
    "name": "玉山",
    "name:bnn": "Tongku Saveq",
    "name:en": "Yushan",
    "name:ja": "玉山",
    "name:pwn": "kanasi",
    "name:tsu": "Patungkuonʉ",
    "name:xnb": "Tanungu'incu",
    "name:zh": "玉山",
    "natural": "peak",
    "prominence": "3952",
    "ref": "百岳#1;五嶽-1",
    "source:prominence": "Highest peak of Taiwan",
    "wikidata": "Q500275",
    "wikipedia": "zh:玉山"
  }
}

目前 OSM API 的版本為 0.6,更多的詳情可見維基頁面

物件可以包含各種 tag

在上面的返回結果裡,我們可以看到玉山有各種不同的 tag,例如name(在地名稱)、alt_name:en(英文別稱)、ele(高度)、wikidata(wikidata 編號),以及相對應的值。

tag 用於標示物件的各種屬性。
不論是 node, way 或 relation,都可以包含任意種類與數量的 tag。

地理位置的標示

node

三個種類裡,只有 node 具有經緯度的地理位置。
way 和 relation 都是透過參照的方式來描述自己在空間中的形狀。

舉例上面的例子來說,玉山的經緯度座標被包含在 <node> 的 attribute 中:

lat="42.8374704" lon="25.1822988"

way

一個 way 物件會具有以下格式:

<way id="5090250" ...>
  <nd ref="822403"/>
  <nd ref="21533912"/>
  <nd ref="821601"/>
  <nd ref="21533910"/>
  <nd ref="135791608"/>
  <nd ref="333725784"/>
  <nd ref="333725781"/>
  <nd ref="333725774"/>
  <nd ref="333725776"/>
  <nd ref="823771"/>
  <tag k="highway" v="residential"/>
  <tag k="name" v="Clipstone Street"/>
  <tag k="oneway" v="yes"/>
</way>

可以看到除了 tag 之外,其內還包含了數個 <nd> 用 id 指向已存在的 node。
這些 node 可以組成線段,或者是多邊形(如果第一個被指向的 node 和最後一個相同)。
因此我們通常使用 way 物件來標示路徑、房屋或者邊界。

relation

和 way 一樣,一個 relation 也同樣使用參照的方式來表示自身。格式可能如下:

<relation id="13092746" ...>
 <member type="node" ref="5690770815" role="stop"/>
 <member type="node" ref="5751940550" role="stop"/>
 ...
 <member type="node" ref="1764649495" role="stop"/>
 <member type="way" ref="96562914" role=""/>
 ...
 <member type="way" ref="928474550" role=""/>
 <tag k="from" v="Encre"/>
 ...
 <tag k="website" v="https://www.cacl-guyane.fr/lagglo-au-quotidien/se-deplacer/transport-urbain-2/"/>
</relation>

可以見到,relation 使用 <member> 來將各種 node 與 way 進行關聯,並使用 role 這個 Attribute 來標示這些物件在集合中所扮演的角色。

relation 物件通常在製作地圖不會特別被渲染出來。它更多時候是表示一群物件之間的關係。

小結

總的來說,OSM 的物件分類並不複雜。
只要掌握 node, way 與 relation 之間的關係,在查閱相關頁面,或者檢視下載下來的原始資料集時就可以無往不利。

種類 id tag 地理資訊
node 座標
way nodes
relation ways/nodes

上一篇
[Day7] 地理資料的寶庫-OpenStreetMap
下一篇
[Day9] 登山相關標籤
系列文
製作適用於網頁的台灣登山地圖25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言